19-3 8-bit v

在 MATLAB 第 4 版時,影像資料都是儲存在雙倍精準(Double-precision)的矩陣中,因此每一個元素用掉了 8 bytes(64 bits),造成許多不必要的空間浪費。在 MATLAB 第 5 版之後,提供了 uint8 的資料型態,因此可以將儲存空間降為原先的八分之一。(uint8 代表 8-bit unsigned integer,即是 8 位元、不帶符號的整數值。)

由於 uint8 只有 8 個位元,所以能表示的數值範圍為 0 至 255(=28-1) 之間的整數,但這對一般索引影像之資料已經足夠了。

由於 8-bit 影像資料的最小值為 0,和一般的雙精準索引影像資料相差 1,因此在兩種資料相互轉換時,要特別小心。例如:

Example 1: 19-影像顯示與讀寫/uint801.mload clown.mat Z8 = uint8(X-1); % 將 X-1 轉成 uint8 的資料型態 close all % 關掉所有的圖形視窗 image(Z8); colormap(map); colorbar;

在上例中,X 是雙精準的索引影像,需將之減 1 後,才能轉換成 unit8 的格式。(image 可以接受兩種資料格式,來正確地顯示影像。)欲比較影像所佔空間大小,可輸入如下:

>> whos X Z8 Name Size Bytes Class X 200x320 512000 double array Z8 200x320 64000 uint8 array Grand total is 128000 elements using 576000 bytes

由上例可知,Z8 所佔用的空間只有 X 的八分之一。若要將 8-bit 影像轉回雙精準影像,可輸入如下:

>> Z64 = double(Z8)+1;

uint8 資料型態亦可用於全彩影像資料,此時每一像素的原色(R,G 或 B)範圍為 0 至 255 間的整數,而不再是 0 至 1 的實數。image 指令可以完全接受 uint8 的全彩影像資料。

欲將雙精準的全彩影像轉作 uint8 資料型態,可輸入如下:

>> RGB8 = uint8(round(RGB64*255));

其中 RGB64 為雙精準的全彩影像資料,而 RGB8 則是 unit8 的 8-bit 影像資料。反之,若欲進行反轉換,可輸入如下:

>> RGB64 = double(RGB8)/255;

有關於影像類別及其資料型態的關係,可見下表:

影像類別資料型態
doubleuint8
索引影像 (Indexed Images) 影像矩陣大小:m×n
色盤矩陣大小:k×3, k$\leq$256
色盤資料範圍:介於 [0, 1] 的實數
影像顯示指令:image
影像資料範圍:介於 [1, k] 的整數影像資料範圍:介於 [0, k-1] 的整數
強度影像 (Intensity Images) 影像矩陣大小:m×n
色盤矩陣大小:k×3, k$\leq$256(色盤通常是灰階)
色盤資料範圍:介於 [0, 1] 的實數
影像顯示指令:imagesc
影像資料範圍:任意實數(但通常是[0,1])影像資料範圍:介於 [0, 255] 的整數
全彩影像 (Truecolor Images) 影像矩陣大小:m×n×3
影像顯示指令:image
影像資料範圍:介於 [0,1] 的實數影像資料範圍:介於 [0, 255] 的整數


MATLAB程式設計:入門篇